﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo
{
    /*
     静态字段存储的值在所有实例化之间是共享的。

    作业：
    现在开班了，班里老师只有一个，叫唐僧。班里的五个人都知道老师叫唐僧(也就是说老师这个字段是共享的)。但是某一天唐僧要去女儿国走丈母娘家了，课不能停啊。所以就请嫦娥姐姐过来带一段课。

    现在5个学生都知道老师换成嫦娥姐姐了，都很激动哈。但是她们是怎么都知道换老师的呢？还是这个静态字段的功劳，将老师姓名声明为静态字段，这个字段是共享的。所以该类的属性都能知道。

    请用代码写出上面的剧情。

    提示：
    定义一个学生类（有哪些字段属性？修饰符是什么？自己考量定义，至少学生姓名要吧），定义一个有参构造方法用来初始化学生姓名。学生类中定义一个成员方法，用来输出学生的信息。

    Main方法中，创建5个学生对象，每个学生执行输出学生信息的方法。
    学生的老师变更，
    再执行每个学生执行输出学生信息的方法。*/
    class Demo4
    {
        class Program4
        {
            static void Main(string[] args)
            {
                Person[] pers = new Person[6];
                pers[0] = new Teacher("嫦娥");
                for (int i = 1; i < pers.Length; i++)
                {
                    pers[i] = new Student($"学生{i}号", i);
                }
                Student.Teacher.SayHello();
                for (int i = 1; i < pers.Length; i++)
                {
                    pers[i].SayHello();
                }
                Student.Teacher = (Teacher)pers[0];
                for (int i = 0; i < pers.Length; i++)
                {
                    pers[i].SayHello();
                }
            }
        }

        public abstract class Person
        {
            private string name;

            protected Person()
            {
            }

            protected Person(string name)
            {
                Name = name;
            }

            public string Name { get => name; set => name = value; }

            public abstract void SayHello();
        }
        public class Student : Person
        {
            private int stuNum;
            private static Teacher teacher;

            public Student()
            {
            }

            public Student(string name, int stuNum) : base(name)
            {
                this.StuNum = stuNum;
            }

            static Student()
            {
                Teacher = new Teacher("唐僧");
            }

            public int StuNum { get => stuNum; set => stuNum = value; }
            public static Teacher Teacher { get => teacher; set => teacher = value; }

            public override void SayHello()
            {
                Console.WriteLine($"My name is {this.Name},My Num is {this.StuNum},My teacher is {Teacher}");
            }
        }

        public class Teacher : Person
        {
            public Teacher()
            {
            }

            public Teacher(string name) : base(name)
            {
            }

            public override void SayHello()
            {
                Console.WriteLine($"i am a teacher,my name is {this.Name}");
            }

            public override string ToString()
            {
                return this.Name;
            }
        }
    }
}

